<!DOCTYPE html>
<html>
<!--
Copyright 2011 The Closure Library Authors. All Rights Reserved.

Use of this source code is governed by the Apache License, Version 2.0.
See the COPYING file for details.

Test suite inspired from http://code.google.com/p/ipaddr-py/ and
Google's Guava InetAddresses test suite available on
http://code.google.com/p/guava-libraries/
-->
  <head>
    <meta http-equiv='X-UA-Compatible' content='IE=edge'>
    <title>Closure Unit Test - goog.net.IpAddress</title>
    <script src='../base.js' type='text/javascript'></script>
    <script type='text/javascript'>
      goog.require('goog.array');
      goog.require('goog.math.Integer');
      goog.require('goog.net.IpAddress');
      goog.require('goog.net.Ipv4Address');
      goog.require('goog.net.Ipv6Address');
      goog.require('goog.testing.jsunit');
    </script>
  </head>
  <body>
    <script text='text/javascript'>
      function testInvalidStrings() {
        assertEquals(null, goog.net.IpAddress.fromString(''));
        assertEquals(null, goog.net.IpAddress.fromString('016.016.016.016'));
        assertEquals(null, goog.net.IpAddress.fromString('016.016.016'));
        assertEquals(null, goog.net.IpAddress.fromString('016.016'));
        assertEquals(null, goog.net.IpAddress.fromString('016'));
        assertEquals(null, goog.net.IpAddress.fromString('000.000.000.000'));
        assertEquals(null, goog.net.IpAddress.fromString('000'));
        assertEquals(null,
            goog.net.IpAddress.fromString('0x0a.0x0a.0x0a.0x0a'));
        assertEquals(null, goog.net.IpAddress.fromString('0x0a.0x0a.0x0a'));
        assertEquals(null, goog.net.IpAddress.fromString('0x0a.0x0a'));
        assertEquals(null, goog.net.IpAddress.fromString('0x0a'));
        assertEquals(null, goog.net.IpAddress.fromString('42.42.42.42.42'));
        assertEquals(null, goog.net.IpAddress.fromString('42.42.42'));
        assertEquals(null, goog.net.IpAddress.fromString('42.42'));
        assertEquals(null, goog.net.IpAddress.fromString('42'));
        assertEquals(null, goog.net.IpAddress.fromString('42..42.42'));
        assertEquals(null, goog.net.IpAddress.fromString('42..42.42.42'));
        assertEquals(null, goog.net.IpAddress.fromString('42.42.42.42.'));
        assertEquals(null, goog.net.IpAddress.fromString('42.42.42.42...'));
        assertEquals(null, goog.net.IpAddress.fromString('.42.42.42.42'));
        assertEquals(null, goog.net.IpAddress.fromString('...42.42.42.42'));
        assertEquals(null, goog.net.IpAddress.fromString('42.42.42.-0'));
        assertEquals(null, goog.net.IpAddress.fromString('42.42.42.+0'));
        assertEquals(null, goog.net.IpAddress.fromString('.'));
        assertEquals(null, goog.net.IpAddress.fromString('...'));
        assertEquals(null, goog.net.IpAddress.fromString('bogus'));
        assertEquals(null, goog.net.IpAddress.fromString('bogus.com'));
        assertEquals(null, goog.net.IpAddress.fromString('192.168.0.1.com'));
        assertEquals(null,
            goog.net.IpAddress.fromString('12345.67899.-54321.-98765'));
        assertEquals(null, goog.net.IpAddress.fromString('257.0.0.0'));
        assertEquals(null, goog.net.IpAddress.fromString('42.42.42.-42'));
        assertEquals(null, goog.net.IpAddress.fromString('3ff3:::1'));
        assertEquals(null, goog.net.IpAddress.fromString('3ffe::1.net'));
        assertEquals(null, goog.net.IpAddress.fromString('3ffe::1::1'));
        assertEquals(null, goog.net.IpAddress.fromString('1::2::3::4:5'));
        assertEquals(null, goog.net.IpAddress.fromString('::7:6:5:4:3:2:'));
        assertEquals(null, goog.net.IpAddress.fromString(':6:5:4:3:2:1::'));
        assertEquals(null, goog.net.IpAddress.fromString('2001::db:::1'));
        assertEquals(null, goog.net.IpAddress.fromString('FEDC:9878'));
        assertEquals(null, goog.net.IpAddress.fromString('+1.+2.+3.4'));
        assertEquals(null, goog.net.IpAddress.fromString('1.2.3.4e0'));
        assertEquals(null, goog.net.IpAddress.fromString('::7:6:5:4:3:2:1:0'));
        assertEquals(null, goog.net.IpAddress.fromString('7:6:5:4:3:2:1:0::'));
        assertEquals(null, goog.net.IpAddress.fromString('9:8:7:6:5:4:3::2:1'));
        assertEquals(null, goog.net.IpAddress.fromString('0:1:2:3::4:5:6:7'));
        assertEquals(null,
            goog.net.IpAddress.fromString('3ffe:0:0:0:0:0:0:0:1'));
        assertEquals(null, goog.net.IpAddress.fromString('3ffe::10000'));
        assertEquals(null, goog.net.IpAddress.fromString('3ffe::goog'));
        assertEquals(null, goog.net.IpAddress.fromString('3ffe::-0'));
        assertEquals(null, goog.net.IpAddress.fromString('3ffe::+0'));
        assertEquals(null, goog.net.IpAddress.fromString('3ffe::-1'));
        assertEquals(null, goog.net.IpAddress.fromString(':'));
        assertEquals(null, goog.net.IpAddress.fromString(':::'));
        assertEquals(null, goog.net.IpAddress.fromString('a:'));
        assertEquals(null, goog.net.IpAddress.fromString('::a:'));
        assertEquals(null, goog.net.IpAddress.fromString('0xa::'));
        assertEquals(null, goog.net.IpAddress.fromString('::1.2.3'));
        assertEquals(null, goog.net.IpAddress.fromString('::1.2.3.4.5'));
        assertEquals(null, goog.net.IpAddress.fromString('::1.2.3.4:'));
        assertEquals(null, goog.net.IpAddress.fromString('1.2.3.4::'));
        assertEquals(null, goog.net.IpAddress.fromString('2001:db8::1:'));
        assertEquals(null, goog.net.IpAddress.fromString(':2001:db8::1'));
      }

      function testVersion() {
        var ip4 = goog.net.IpAddress.fromString('1.2.3.4');
        assertEquals(ip4.getVersion(), 4);

        var ip6 = goog.net.IpAddress.fromString('2001:dead::beef:1');
        assertEquals(ip6.getVersion(), 6);

        ip6 = goog.net.IpAddress.fromString('::192.168.1.1');
        assertEquals(ip6.getVersion(), 6);
      }

      function testStringIpv4Address() {
        assertEquals('192.168.1.1',
            new goog.net.Ipv4Address('192.168.1.1').toString());
        assertEquals('1.1.1.1',
            new goog.net.Ipv4Address('1.1.1.1').toString());
        assertEquals('224.56.33.2',
            new goog.net.Ipv4Address('224.56.33.2').toString());
        assertEquals('255.255.255.255',
            new goog.net.Ipv4Address('255.255.255.255').toString());
        assertEquals('0.0.0.0',
            new goog.net.Ipv4Address('0.0.0.0').toString());
      }

      function testIntIpv4Address() {
        var ip4Str = new goog.net.Ipv4Address('1.1.1.1');
        var ip4Int = new goog.net.Ipv4Address(
            new goog.math.Integer([16843009], 0));

        assertTrue(ip4Str.equals(ip4Int));
        assertEquals(ip4Str.toString(), ip4Int.toString());

        assertThrows('Ipv4(-1)', goog.partial(goog.net.Ipv4Address,
                                              goog.math.Integer.fromInt(-1)));
        assertThrows('Ipv4(2**32)',
                     goog.partial(goog.net.Ipv4Address,
                                  goog.math.Integer.ONE.shiftLeft(32)));
      }

      function testStringIpv6Address() {
        assertEquals('1:2:3:4:5:6:7:8',
            new goog.net.Ipv6Address('1:2:3:4:5:6:7:8').toString());
        assertEquals('::1:2:3:4:5:6:7',
            new goog.net.Ipv6Address('::1:2:3:4:5:6:7').toString());
        assertEquals('1:2:3:4:5:6:7::',
            new goog.net.Ipv6Address('1:2:3:4:5:6:7:0').toString());
        assertEquals('2001:0:0:4::8',
            new goog.net.Ipv6Address('2001:0:0:4:0:0:0:8').toString());
        assertEquals('2001::4:5:6:7:8',
            new goog.net.Ipv6Address('2001:0:0:4:5:6:7:8').toString());
        assertEquals('2001::3:4:5:6:7:8',
            new goog.net.Ipv6Address('2001:0:3:4:5:6:7:8').toString());
        assertEquals('0:0:3::ffff',
            new goog.net.Ipv6Address('0:0:3:0:0:0:0:ffff').toString());
        assertEquals('::4:0:0:0:ffff',
            new goog.net.Ipv6Address('0:0:0:4:0:0:0:ffff').toString());
        assertEquals('::5:0:0:ffff',
            new goog.net.Ipv6Address('0:0:0:0:5:0:0:ffff').toString());
        assertEquals('1::4:0:0:7:8',
            new goog.net.Ipv6Address('1:0:0:4:0:0:7:8').toString());
        assertEquals('::',
            new goog.net.Ipv6Address('0:0:0:0:0:0:0:0').toString());
        assertEquals('::1',
            new goog.net.Ipv6Address('0:0:0:0:0:0:0:1').toString());
        assertEquals('2001:658:22a:cafe::',
            new goog.net.Ipv6Address(
                '2001:0658:022a:cafe:0000:0000:0000:0000').toString());
        assertEquals('::102:304',
            new goog.net.Ipv6Address('::1.2.3.4').toString());
        assertEquals('::ffff:303:303',
            new goog.net.Ipv6Address('::ffff:3.3.3.3').toString());
        assertEquals('::ffff:ffff',
            new goog.net.Ipv6Address('::255.255.255.255').toString());
      }

      function testIntIpv6Address() {
        var ip6Str = new goog.net.Ipv6Address('2001::dead:beef:1');
        var ip6Int = new goog.net.Ipv6Address(
            new goog.math.Integer([3203334145, 57005, 0, 536936448], 0));

        assertTrue(ip6Str.equals(ip6Int));
        assertEquals(ip6Str.toString(), ip6Int.toString());

        assertThrows('Ipv6(-1)', goog.partial(goog.net.Ipv6Address,
                                              goog.math.Integer.fromInt(-1)));
        assertThrows('Ipv6(2**128)',
                     goog.partial(goog.net.Ipv6Address,
                                  goog.math.Integer.ONE.shiftLeft(128)));

      }

      function testDottedQuadIpv6() {
        var ip6 = new goog.net.Ipv6Address('7::0.128.0.127');
        ip6 = new goog.net.Ipv6Address('7::0.128.0.128');
        ip6 = new goog.net.Ipv6Address('7::128.128.0.127');
        ip6 = new goog.net.Ipv6Address('7::0.128.128.127');
      }

      function testMappedIpv4Address() {
        var testAddresses = ['::ffff:1.2.3.4', '::FFFF:102:304'];
        var ipv4Str = '1.2.3.4';

        var ip1 = new goog.net.Ipv6Address(testAddresses[0]);
        var ip2 = new goog.net.Ipv6Address(testAddresses[1]);
        var ipv4 = new goog.net.Ipv4Address(ipv4Str);

        assertTrue(ip1.isMappedIpv4Address());
        assertTrue(ip2.isMappedIpv4Address());
        assertTrue(ip1.equals(ip2));
        assertTrue(ipv4.equals(ip1.getMappedIpv4Address()));
        assertTrue(ipv4.equals(ip2.getMappedIpv4Address()));
      }


      function testUriString() {
        var ip4Str = '192.168.1.1';
        var ip4Uri = goog.net.IpAddress.fromUriString(ip4Str);
        var ip4 = goog.net.IpAddress.fromString(ip4Str);
        assertTrue(ip4Uri.equals(ip4));

        var ip6Str = '2001:dead::beef:1';
        assertEquals(null, goog.net.IpAddress.fromUriString(ip6Str));

        var ip6Uri = goog.net.IpAddress.fromUriString('[' + ip6Str + ']');
        var ip6 = goog.net.IpAddress.fromString(ip6Str);
        assertTrue(ip6Uri.equals(ip6));
        assertEquals(ip6Uri.toString(), ip6Str);
        assertEquals(ip6Uri.toUriString(), '[' + ip6Str + ']');
      }
    </script>
  </body>
</html>
